package com.zhida84.Convert;


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * StringUtil
 * <p>
 * 字符帮助类。
 * </p>
 * 
 * @author sunChangXing
 * @version v1.0.0
 *          <p>
 *          <B>last update </B> by sunChangXing @ 2018年1月10日
 *          </p>
 * @since v1.0.0
 */
public class StringUtil {
	/**
	 * 
	 * 计算分页。
	 * <p>
	 * </p>
	 * 
	 * @param pageIndex
	 *            起始页
	 * @param pageSize
	 *            每页数
	 * @return
	 */
	public static Integer calculatePage(Integer pageIndex, Integer pageSize) {
		Integer startPos = 0;
		pageIndex = pageIndex == null ? 0 : pageIndex;
		pageSize = pageSize == null ? 40 : pageSize;
		if (pageIndex > 0) {
			startPos = (pageIndex - 1) * pageSize;
		}
		return startPos;
	}

	/**
	 * 
	 * 对String的判断是否为null、""。
	 * <p>
	 * </p>
	 * 
	 * @param value
	 *            字符串
	 * @return
	 */
	public static boolean isEmpty(String value) {
		boolean result;
		if (null == value || "".equals(value)) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 
	 * 对integer的判断是否为null。
	 * <p>
	 * </p>
	 * 
	 * @param value
	 *            数值
	 * @return
	 */
	public static boolean isEmpty(Integer value) {
		boolean result;
		if (null == value) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 
	 * 判断传入的可变数组里面的值是否为空， 目前只支持integer和String类型的判断。
	 * <p>
	 * </p>
	 * 
	 * @param arg
	 *            数据
	 * @return
	 */
	public static boolean isEmpty(Object... arg) {
		boolean result = false;
		for (Object value : arg) {
			if (null == value) {
				result = true;
				break;
			} else if (value instanceof String && "".equals(value)) {
				result = true;
				break;
			}
		}
		return result;
	}

	/**
	 * 
	 * 将String转换成integer。
	 * <p>
	 * </p>
	 * 
	 * @param value
	 *            字符串
	 * @return
	 */
	public static Integer convertStringToInteget(String value) {
		Integer result;
		if (null == value) {
			return null;
		}
		result = Integer.valueOf(value);
		return result;
	}

	/**
	 * 
	 * obj转换成string。
	 * <p>
	 * </p>
	 * 
	 * @param value
	 *            数据
	 * @return
	 */
	public static String convertObjToStr(Object value) {
		if (null == value) {
			return null;
		}
		return String.valueOf(value);
	}
	
	/**
	 * 
	 * 判断当前实体类内部指定的key是否为空。
	 * <p></p>
	 * @param obj 实体类
	 * @param keys 属性名
	 * @return
	 */
	public static boolean isEmptyByKeys(Object obj, String... keys) {
		boolean result = false;
		List<String> keyNames = new ArrayList<String>();
		for (String key : keys) {
			keyNames.add(key);
		}
		if (null == obj || keyNames.isEmpty()) {
			result = true;
		} else {
			Class<?> cls = obj.getClass();
			Field[] fields = cls.getDeclaredFields();
			Method[] methodGets = cls.getMethods();
			int methodCount = methodGets.length;
			List<String> methodNames = new ArrayList<String>();
			for (int i = 0; i < methodCount; i++) {
				methodNames.add(methodGets[i].getName());
			}
			int fieldCount = fields.length;
			List<String> fieldNames = new ArrayList<String>();
			for (int i = 0; i < fieldCount; i++) {
				fieldNames.add(fields[i].getName());
			}
			for (String key : keys) {
				if (fieldNames.contains(key)) {
					String strGet = "get" + key.substring(0, 1).toUpperCase() + key.substring(1, key.length());
					if (methodNames.contains(strGet)) {
						try {
							Method methodGet = cls.getMethod(strGet);
							Object object = methodGet.invoke(obj);
							if (null == object) {
								return true;
							}
						} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
								| NoSuchMethodException | SecurityException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
		return result;
	}

}